/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package taw2012;
import java.io.BufferedInputStream;
import java.net.URL;
import java.util.Calendar;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.tidy.Tidy;
/**
 * Estrazione previsioni meteo dal sito www.ilmeteo.it
 * @author Filippo
 */
public class ParsingHtml {
    
    private final static int LUNGHEZZA_ARRAY_PREVISIONI=7;
    /**
     * Questo ritorna l'oggetto documento dal file su cui fare parsing
     * @param file file su cui fare parsing
     * @return l'oggetto documento dal file
     * @throws Exception 
     */
    private static Document getDocument(int idLocalita) throws Exception {
        Document doc;
        Tidy t= new Tidy();
        URL url = new URL("http://www.ilmeteo.it/portale/meteo/previsioni.php?citta=Venezia&c="+idLocalita+"&g=-1&lang=ita");
        BufferedInputStream page = new BufferedInputStream(url.openStream());
        t.setQuiet(true);
        t.setShowWarnings(false);
        doc= t.parseDOM(page, null);
        return doc;
    }
    /**
     * estrae direttamente dal sito www.ilmeteo.it le previsioni per una settimana 
     * @param idLocalita indicativo della localita secondo l'elenco fornito.
     * @return Array di previsioni meteo della localita per sette giorni.
     * @throws Exception 
     */
    public static Previsione[] estraiPrevisioneLocalita(int idLocalita) throws Exception {
        Previsione[] ret=new Previsione[7];
        Document doc= getDocument(idLocalita);
        XPathFactory factory = XPathFactory.newInstance();
        XPath xPath=factory.newXPath();
        String pattern = "/html/body[@class='datapage']/div[@class='locbody']/div[@class='locbody-content']/p[@class='location']/strong/text()";
        NodeList nodes = (NodeList)xPath.evaluate(pattern, doc, XPathConstants.NODESET);
        String nomeLocalita = (String) nodes.item(0).getNodeValue();
        String tr;
        int offset = 1;
        for(int i=0; i<LUNGHEZZA_ARRAY_PREVISIONI; i++){
            // inserisce id, localita e data
            ret[i]= new Previsione(idLocalita, nomeLocalita, Calendar.getInstance());
            ret[i].getDataPrevisione().add(Calendar.DAY_OF_MONTH, i);
            // parsing previsione
            offset++;
            tr="//table/tr["+offset+"]";
            nodes = (NodeList) xPath.evaluate(tr+"/td[3]/text()", doc, XPathConstants.NODESET);
            ret[i].setPrevisione(nodes.item(0).getNodeValue());
            //parsing tMin
            nodes = (NodeList) xPath.evaluate(tr+"/td[4]/text()", doc, XPathConstants.NODESET);
            ret[i].settMin(nodes.item(0).getNodeValue());
            // parsing Tmax
            nodes = (NodeList) xPath.evaluate(tr+"/td[5]/text()", doc, XPathConstants.NODESET);
            ret[i].settMax(nodes.item(0).getNodeValue());
            //parsing percentuale precipitazioni
            nodes = (NodeList) xPath.evaluate(tr+"/td[6]//span/text()", doc, XPathConstants.NODESET);
            ret[i].setPercentualePrecipitazioni(nodes.item(0).getNodeValue());
            // vento
            nodes = (NodeList) xPath.evaluate(tr+"/td[8]/*/text()", doc, XPathConstants.NODESET);
            ret[i].setVentoKmh(nodes.item(0).getNodeValue());
            // pressione
            nodes = (NodeList) xPath.evaluate(tr+"/td[9]/text()", doc, XPathConstants.NODESET);
            ret[i].setPressione(nodes.item(0).getNodeValue());
            // quota zero
            nodes = (NodeList) xPath.evaluate(tr+"/td[10]/text()", doc, XPathConstants.NODESET);
            ret[i].setQuotaZero(nodes.item(0).getNodeValue());
        }
              
        return ret;
    }
    
    public static void main(String[] args){
        int numeroCittaPartenza=1;
        int numeroPrevisioniCitta=50;
        for (int l=numeroCittaPartenza; l<numeroCittaPartenza+numeroPrevisioniCitta; l++){
            try {
                Previsione[] p = estraiPrevisioneLocalita(l);
                for(int i=0; i<p.length; i++)
                    System.out.println(p[i]);
            } catch (Exception ex) {
                System.out.println("cacca "+ex);
            }
        }
    }
    
}
